package com.ftg.learn.upload.utils;

import com.ftg.learn.common.constant.MessageErrorConstant;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.multipart.MultipartFile;

import java.util.Arrays;
import java.util.List;

@Slf4j
public class FileUploadUtil {
    
    // 允许的文件类型
    private static final List<String> ALLOWED_IMAGE_TYPES = Arrays.asList(
            ".jpg", ".jpeg", ".png", ".gif", ".bmp", ".webp"
    );
    
    private static final List<String> ALLOWED_VIDEO_TYPES = Arrays.asList(
            ".mp4", ".avi", ".mov", ".wmv", ".flv", ".mkv"
    );
    
    // 文件大小限制（10MB）
    private static final long MAX_FILE_SIZE = 10 * 1024 * 1024;
    
    /**
     * 验证文件
     * @param file 文件
     * @return 错误信息，如果验证通过返回null
     */
    public static String validateFile(MultipartFile file) {
        if (file == null || file.isEmpty()) {
            return "文件不能为空";
        }
        
        // 检查文件大小
        if (file.getSize() > MAX_FILE_SIZE) {
            return "文件大小不能超过10MB";
        }
        
        // 获取文件扩展名
        String originalFilename = file.getOriginalFilename();
        if (originalFilename == null) {
            return "文件名不能为空";
        }
        
        String suffix = originalFilename.substring(originalFilename.lastIndexOf(".")).toLowerCase();
        
        // 检查文件类型
        if (!isValidFileType(suffix)) {
            return "不支持的文件类型，仅支持图片和视频文件";
        }
        
        return null;
    }
    
    /**
     * 检查文件类型是否有效
     * @param suffix 文件后缀
     * @return 是否有效
     */
    private static boolean isValidFileType(String suffix) {
        return ALLOWED_IMAGE_TYPES.contains(suffix) || ALLOWED_VIDEO_TYPES.contains(suffix);
    }
    
    /**
     * 生成文件存储路径
     * @param originalFilename 原始文件名
     * @return 存储路径
     */
    public static String generateFilePath(String originalFilename) {
        String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
        return "uploads/" + System.currentTimeMillis() + "_" + java.util.UUID.randomUUID().toString() + suffix;
    }
    
    /**
     * 获取文件类型
     * @param filename 文件名
     * @return 文件类型（image/video）
     */
    public static String getFileType(String filename) {
        String suffix = filename.substring(filename.lastIndexOf(".")).toLowerCase();
        if (ALLOWED_IMAGE_TYPES.contains(suffix)) {
            return "image";
        } else if (ALLOWED_VIDEO_TYPES.contains(suffix)) {
            return "video";
        }
        return "unknown";
    }
} 